﻿using System;
using System.Runtime.Remoting.Messaging;
using System.Reflection;

namespace Sofire.AOP
{
    /// <summary>
    /// 在“实例化对象”、“设置或获取字段”、“设置或获取属性”、“注册或注销事件”或“调用方法”时发生的消息。
    /// </summary>
    public class EnterInvokeMessage
    {

        /* -- 新功能 -- *
         * 重新 Call Request 请使用 MethodCall：
         * 重新 Return Response  请使用 ReturnMessage
         */

        private IMethodCallMessage _Call;
        /// <summary>
        /// 获取一个值，表示调用的消息。
        /// </summary>
        public IMethodCallMessage Call
        {
            get
            {
                return this._Call;
            }
        }

        private CallAction _Action;
        /// <summary>
        /// 获取一个值，表示调用的行为。
        /// </summary>
        public CallAction Action
        {
            get
            {
                return this._Action;
            }
        }

        private object _Instance;
        /// <summary>
        /// 获取一个值，表示调用的实例对象。
        /// </summary>
        public object Instance
        {
            get
            {
                return this._Instance;
            }
        }

        private bool _CallDenied;
        /// <summary>
        /// 设置或获取一个值，指示是否拒绝调用。默认为 false，表示允许调用。
        /// </summary>
        public bool CallDenied
        {
            get
            {
                return this._CallDenied;
            }
            set
            {
                this._CallDenied = value;
            }
        }


        //public string MethodName
        //{
        //    get
        //    {
        //        return this._Call.MethodName;
        //    }
        //}
        //public string TypeName
        //{
        //    get
        //    {
        //        return this._Call.TypeName;
        //    }
        //}

        //public object[] MethodSignature
        //{
        //    get
        //    {
        //        return this._Call.MethodSignature as object[];
        //    }
        //}

        //public object[] Args
        //{
        //    get
        //    {
        //        return this._Call.Args;
        //    }
        //}

        //public int ArgCount
        //{
        //    get
        //    {
        //        return this._Call.ArgCount;
        //    }
        //}

        //public bool HasVarArgs
        //{
        //    get
        //    {
        //        return this._Call.HasVarArgs;
        //    }
        //}

        //public MethodBase MethodBase
        //{
        //    get
        //    {
        //        return this._Call.MethodBase;
        //    }
        //}

        //public int InArgCount
        //{
        //    get
        //    {
        //        return this._Call.InArgCount;
        //    }
        //}

        //public object[] InArgs
        //{
        //    get
        //    {
        //        return this._Call.InArgs;
        //    }
        //}

        //public string GetArgName(int index)
        //{
        //    return this._Call.GetArgName(index);
        //}

        //public object GetArg(int index)
        //{
        //    return this._Call.GetArg(index);
        //}

        //public string GetInArgName(int index)
        //{
        //    return this._Call.GetInArgName(index);
        //}

        //public object GetInArg(int index)
        //{
        //    return this._Call.GetInArg(index);
        //}

        internal EnterInvokeMessage(object instance, CallAction action, IMethodCallMessage call)
        {
            this._Call = call;
            this._Instance = instance;
            this._Action = action;
        }
    }
}
